package com.sky.controller.admin;

import com.sky.constant.JwtClaimsConstant;
import com.sky.dto.EmployeeDTO;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.dto.EmployeePageQueryDTO;
import com.sky.dto.PasswordEditDTO;
import com.sky.entity.Employee;
import com.sky.properties.JwtProperties;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.EmployeeService;
import com.sky.utils.JwtUtil;
import com.sky.vo.EmployeeLoginVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 员工管理
 */
@RestController
@RequestMapping("/admin/employee")
@Slf4j
@Api(tags = "员工相关接口")
public class EmployeeController {
	
	@Autowired
	private EmployeeService employeeService;
	@Autowired
	private JwtProperties jwtProperties;
	
	/**
	 * 登录
	 *
	 * @param employeeLoginDTO
	 * @return
	 */
	@PostMapping("/login")
	@ApiOperation("登录账户")
	public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {
		log.info("员工登录：{}", employeeLoginDTO);
		
		Employee employee = employeeService.login(employeeLoginDTO);
		
		//登录成功后，生成jwt令牌
		Map<String, Object> claims = new HashMap<>();
		claims.put(JwtClaimsConstant.EMP_ID, employee.getId());
		String token = JwtUtil.createJWT(
			jwtProperties.getAdminSecretKey(),
			jwtProperties.getAdminTtl(),
			claims);
		
		EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder()
			.id(employee.getId())
			.userName(employee.getUsername())
			.name(employee.getName())
			.token(token)
			.build();
		
		return Result.success(employeeLoginVO);
	}
	
	/**
	 * 退出
	 *
	 * @return
	 */
	@PostMapping("/logout")
	@ApiOperation("退出登录")
	public Result<String> logout() {
		return Result.success();
	}
	
	/**
	 * 添加员工
	 */
	@PostMapping
	@ApiOperation("新增员工")
	public Result<String> addEmployee(@RequestBody EmployeeDTO employeeDTO) {
		log.info("新增员工：{}", employeeDTO);
		employeeService.addEmployee(employeeDTO);
		return Result.success();
	}
	
	/**
	 * 员工分页查询
	 *
	 * @return
	 */
	@GetMapping("/page")
	@ApiOperation("员工分页查询")
	public Result<PageResult> getEmployee(EmployeePageQueryDTO employeePageQueryDTO) {
		log.info("员工分页查询：{}", employeePageQueryDTO);
		return Result.success(employeeService.getEmployees(employeePageQueryDTO));
	}
	
	/**
	 * 禁用/启用员工
	 *
	 * @param id
	 * @param status
	 * @return
	 */
	
	@PostMapping("/status/{status}")
	@ApiOperation("禁用/启用员工")
	public Result disableEmployee(Long id, @PathVariable Integer status) {
		log.info("禁用/启用员工账户:{},{}", id, status);
		employeeService.disableEmployee(id, status);
		return Result.success();
	}
	
	/**
	 * 根据id 查询员工
	 */
	@GetMapping("/{id}")
	@ApiOperation("根据id查询员工")
	public Result<Employee> getEmployeeId(@PathVariable Long id) {
		log.info("根据id查询数据：{}", id);
		return Result.success(employeeService.getEmployeeId(id));
	}
	
	/**
	 * 编辑员工
	 */
	@PutMapping
	@ApiOperation("编辑员工信息")
	public Result putEmployee(@RequestBody Employee employee) {
		log.info("编辑员工信息：{}", employee);
		employeeService.putEmployee(employee);
		return Result.success();
	}
	
	/**
	 * 修改密码
	 *
	 * @param passwordEditDTO
	 * @return
	 */
	@PutMapping("/editPassword")
	@ApiOperation("修改密码")
	public Result putPassword(@RequestBody PasswordEditDTO passwordEditDTO) {
		log.info("修改密码：{}", passwordEditDTO);
		if (passwordEditDTO.getNewPassword().equals(passwordEditDTO.getOldPassword())) {
			return Result.error("新密码不能与旧密码相同");
		}
		employeeService.putPassword(passwordEditDTO);
		return Result.success();
	}
	
}














